import { Module } from '@nestjs/common';
import { UploadService } from './upload.service';
import { FileUploadController } from './upload.controller';
import { MulterModule } from '@nestjs/platform-express';
import * as dayjs from 'dayjs';
import { diskStorage } from 'multer';
import { v4 as uuidv4 } from 'uuid';
import { ensureDir } from '@/utils/index';

/**
 * 获取文件扩展名并转换为小写形式
 * @param file 包含原始文件名的对象
 * @returns 文件扩展名的小写形式，若无法解析则返回空字符串
 */
function getSafeFileExtension(file: { originalname: string }): string {
    // 确保 originalname 存在且非空
    const originalName = file?.originalname?.trim();
    if (!originalName || !originalName.includes('.')) {
        return ''; // 若无合法文件名或无扩展名，返回空字符串
    }

    // 提取扩展名并转为小写
    const extension = originalName.split('.').pop()?.toLowerCase() ?? '';
    
    // 额外的安全性检查（可选）
    // 确保扩展名只包含字母、数字或常见符号
    if (!/^[a-z0-9]+$/i.test(extension)) {
        return ''; // 若扩展名包含非法字符，返回空字符串
    }

    return extension;
}

@Module({
    imports: [
        MulterModule.registerAsync({
            useFactory: async () => ({
                limits: {
                    fileSize: 1024 * 1024 * 5, // 限制文件大小为 5MB
                },
                storage: diskStorage({
                    // 配置文件上传后的文件夹路径
                    destination: (_, file, cb) => {
                        // 定义文件上传格式
                        const allowedImageTypes = ['gif', 'png', 'jpg', 'jpeg', 'bmp', 'webp', 'svg', 'tiff']; // 图片
                        const allowedOfficeTypes = ['xls', 'xlsx', 'doc', 'docx', 'ppt', 'pptx', 'pdf', 'txt', 'md', 'csv']; // office
                        const allowedVideoTypes = ['mp4', 'avi', 'wmv']; // 视频
                        const allowedAudioTypes = ['mp3', 'wav', 'ogg']; // 音频
                        // 根据上传的文件类型将图片视频音频和其他类型文件分别存到对应英文文件夹
                        const fileExtension = getSafeFileExtension(file);
                        let temp = 'other';
                        if (allowedImageTypes.includes(fileExtension)) {
                            temp = 'image';
                        } else if (allowedOfficeTypes.includes(fileExtension)) {
                            temp = 'office';
                        } else if (allowedVideoTypes.includes(fileExtension)) {
                            temp = 'video';
                        } else if (allowedAudioTypes.includes(fileExtension)) {
                            temp = 'audio';
                        }
                        // 文件以年月命名文件夹
                        const filePath = `public/${temp}/${dayjs().format('YYYY-MM')}`;
                        const fullPath = `./${filePath}`;

                        // 确保目录存在，不存在则创建
                        ensureDir(fullPath)
                            .then(() => {
                                return cb(null, fullPath);
                            })
                            .catch((err) => {
                              cb(err, ""); // 捕获异常并正确传递参数
                            });
                    },

                    filename: (_, file, cb) => {
                        // 使用随机 uuid 生成文件名
                        const filename = `${uuidv4()}.${file.mimetype.split('/')[1]}`;
                        return cb(null, filename);
                    },
                }),
            }),
        }),
    ],
    controllers: [FileUploadController],
    providers: [UploadService],
})
export class UploadModule { }